home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / DEMOS / CHESS / MAIN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  4.6 KB  |  201 lines

  1. /*
  2.  * main.c - part of the chess demo in the glut distribution.
  3.  *
  4.  * (C) Henk Kok (kok@wins.uva.nl)
  5.  *
  6.  * This file can be freely copied, changed, redistributed, etc. as long as
  7.  * this copyright notice stays intact.
  8.  */
  9.  
  10. #include <stdlib.h>
  11. #include <GL/glut.h>
  12. #include <math.h>
  13.  
  14. #include "chess.h"
  15.  
  16. /* Some <math.h> files do not define M_PI... */
  17. #ifndef M_PI
  18. #define M_PI 3.14159265358979323846
  19. #endif
  20.  
  21. #define M_TEXTURING    1
  22. #define M_REFLECTION    2
  23. #define M_CHAOS        3
  24. #define M_ANIMATION    4
  25.  
  26. extern int reflection, texturing, animating, chaos;
  27.  
  28. GLfloat lightpos[4] = { 2.0, 1.0, 1.0, 0.0 };
  29. GLfloat lightamb[4] = { 1.0, 1.0, 1.0, 1.0 };
  30. GLfloat lightdif[4] = { 1.0, 1.0, 1.0, 1.0 };
  31.  
  32. float angle = 0.0, a2 =  45.0;
  33. int speed = 0;
  34. GLfloat px = -3.5, py = -16.5, pz = 9.5;
  35.  
  36. void SetCamera(void)
  37. {
  38.     gluLookAt(0.0,2.0,2.0, 0.0,2.0,0.0, 0.0,1.0,0.0);
  39.     glRotatef(a2, 1.0, 0.0, 0.0);
  40.     glRotatef(angle, 0.0, 1.0, 0.0);
  41.     glTranslatef(px, -pz, py);
  42.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  43. }
  44.  
  45. void display(void)
  46. {
  47.     glLoadIdentity();
  48.     SetCamera();
  49.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  50.     do_display();
  51.     glutSwapBuffers();
  52. }
  53.  
  54. void myinit(void)
  55. {
  56.     glShadeModel (GL_SMOOTH);
  57.     glFrontFace(GL_CCW);
  58.     glEnable(GL_DEPTH_TEST);
  59.  
  60.     glLoadIdentity();
  61.     glClearColor(0.0, 0.0, 0.0, 1.0);
  62.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  63.     glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb);
  64.     glLightfv(GL_LIGHT0, GL_DIFFUSE, lightdif);
  65.     glEnable(GL_LIGHTING);
  66.     glEnable(GL_LIGHT0);
  67.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  68.     init_lists();
  69. }
  70.  
  71. void Animate(void)
  72. {
  73.     px -= speed * 0.02 * sin(angle*M_PI/180);
  74.     py += speed * 0.02 * cos(angle*M_PI/180);
  75.     if (animating)
  76.     proceed();
  77.     glutPostRedisplay();
  78. }
  79.  
  80. extern int chaosPieces;
  81.  
  82. /* ARGSUSED1 */
  83. void parsekey(unsigned char key, int x, int y)
  84. {
  85.     switch (key)
  86.     {
  87.     case 27: exit(0);
  88.     case 13: speed = 0; break;
  89.     case 'a': a2 += 5; break;
  90.     case 'z': a2 -= 5; break;
  91.     case 'A': pz += 0.5; break;
  92.     case 'Z': pz -= 0.5; break;
  93.         default:
  94.         return;
  95.     }
  96.     glutPostRedisplay();
  97.     if (animating || (chaosPieces > 0) || (speed != 0)) 
  98.           glutIdleFunc(Animate);
  99.     else
  100.           glutIdleFunc(NULL);
  101. }
  102.  
  103. /* ARGSUSED1 */
  104. void parsekey_special(int key, int x, int y)
  105. {
  106.     switch (key)
  107.     {
  108.     case GLUT_KEY_UP:    speed += 1; break;
  109.     case GLUT_KEY_DOWN:    speed -= 1; break;
  110.     case GLUT_KEY_RIGHT:    angle += 5; break;
  111.     case GLUT_KEY_LEFT:    angle -= 5; break;
  112.     case GLUT_KEY_HOME:
  113.             angle = 0.0, a2 =  45.0;
  114.             speed = 0;
  115.             px = -3.5, py = -16.5, pz = 9.5;
  116.             break;
  117.         default:
  118.         return;
  119.     }
  120.     glutPostRedisplay();
  121.     if (animating || (chaosPieces > 0) || (speed != 0)) 
  122.           glutIdleFunc(Animate);
  123.     else
  124.           glutIdleFunc(NULL);
  125. }
  126.  
  127. void handle_main_menu(int item)
  128. {
  129.     switch(item) {
  130.     case M_REFLECTION:
  131.     reflection = !reflection;
  132.         glutPostRedisplay();
  133.     break;
  134.     case M_TEXTURING:
  135.     texturing = !texturing;
  136.         glutPostRedisplay();
  137.     break;
  138.     case M_ANIMATION:
  139.     animating = !animating;
  140.     if (animating || (chaosPieces > 0) || (speed != 0)) 
  141.           glutIdleFunc(Animate);
  142.     else
  143.           glutIdleFunc(NULL);
  144.     break;
  145.     case M_CHAOS:
  146.     chaos = !chaos;
  147.     if (animating || chaos || (speed != 0)) 
  148.           glutIdleFunc(Animate);
  149.     break;
  150.     }
  151. }
  152.  
  153. void
  154. Visible(int visible)
  155. {
  156.   if (visible == GLUT_VISIBLE) {
  157.     if (animating || (chaosPieces > 0) || (speed != 0))
  158.       glutIdleFunc(Animate);
  159.   } else {
  160.     glutIdleFunc(NULL);
  161.   }
  162. }
  163.  
  164. void myReshape(int w, int h)
  165. {
  166.     glMatrixMode(GL_PROJECTION);
  167.     glLoadIdentity();
  168.     glFrustum (-0.1, 0.1, -0.1, 0.1, 0.3, 200.0);
  169.     glMatrixMode (GL_MODELVIEW);
  170.     glViewport(0, 0, w, h);
  171.     glLoadIdentity();
  172.     SetCamera();
  173. }
  174.  
  175. int main(int argc, char *argv[])
  176. {
  177.     glutInit(&argc, argv);
  178.     glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE | GLUT_STENCIL);
  179.     glutCreateWindow("Chess");
  180.     glutDisplayFunc(display);
  181.     glutInitWindowPosition(200, 0);
  182.     glutInitWindowSize(300, 300);
  183.     glutKeyboardFunc(parsekey);
  184.     glutSpecialFunc(parsekey_special);
  185.     glutReshapeFunc(myReshape);
  186.     glutVisibilityFunc(Visible);
  187.     myinit();
  188.  
  189.     glutCreateMenu(handle_main_menu);
  190.     glutAddMenuEntry("Toggle texturing", M_TEXTURING);
  191.     glutAddMenuEntry("Toggle reflection", M_REFLECTION);
  192.     glutAddMenuEntry("-----------------", -1);
  193.     glutAddMenuEntry("Toggle animation", M_ANIMATION);
  194.     glutAddMenuEntry("Toggle CHAOS!", M_CHAOS);
  195.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  196.  
  197.     glutSwapBuffers();
  198.     glutMainLoop();
  199.     return 0;             /* ANSI C requires main to return int. */
  200. }
  201.